package com.fund.utils;


import cn.hutool.core.lang.UUID;
import cn.hutool.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 应用日期工具
 *
 * @author tght
 * @date 2022/12/19
 */
@Slf4j
public class AppDateUtil {

    /**
     * 时区 - 默认
     */
    public static final String TIME_ZONE_DEFAULT = "GMT+8";

    /**
     * 秒转换成毫秒
     */
    public static final long SECOND_MILLIS = 1000;

    public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss";
    public static final String FORMAT_YEAR_MONTH_DAY = "yyyy-MM-dd";
    public static final char[] day_of_week = {'日', '一', '二', '三', '四', '五', '六'};


    public static void main(String[] args) {

//         // 当前时间
//        Date dateTime = AppDateUtil.getDateTime();
//        // 获取距当前的前一天时间
//        Date date = AppDateUtil.DayToDay(dateTime, 1);
//        // 将date转为字符串
//        String s1 = AppDateUtil.DateDayToString(date);
//        // 2022-09-12 20:04:46
//        log.info(s1);
//
//        //判断今天是否是工作日 周末 还是节假日
//        SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
//        String httpArg = f.format(new Date());
//        log.info("今天日期"+httpArg);
//        String jsonResult = isHolidays(httpArg);
//        log.info(jsonResult);
//        //0 上班 1周末 2节假日
//
//        // 31
//        log.info(getMonthDayByDate(new Date()));
//
//        String s2 = calendarData(new Date());
//        log.info(s2);

//        Date date = StringToDate("2000-05-24");
//
//        int age = getAge(date);
//        log.info(age);

//        Date time = getDayDateTime();
        String s = HttpUtil.get("http://fundgz.1234567.com.cn/js/001186.js?rt=14635586760061");
        log.info(s);
    }


    /**
     * 根据出生日期算年龄
     *
     * @param birth 出生
     * @return int
     */
    public static int getAge(Date birth) {

        Calendar cal = Calendar.getInstance();
        int thisYear = cal.get(Calendar.YEAR);
        int thisMonth = cal.get(Calendar.MONTH);
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);

        cal.setTime(birth);
        int birthYear = cal.get(Calendar.YEAR);
        int birthMonth = cal.get(Calendar.MONTH);
        int birthdayOfMonth = cal.get(Calendar.DAY_OF_MONTH);

        int age = thisYear - birthYear;

        // 未足月
        if (thisMonth <= birthMonth) {
            // 当月
            if (thisMonth == birthMonth) {
                // 未足日
                if (dayOfMonth < birthdayOfMonth) {
                    age--;
                }
            } else {
                age--;
            }
        }
        return age;
    }


    /**
     * 日历数据
     * 计算输入的日期数据对应的星期几。
     *
     * @param dateTime 日期时间
     * @return {@link String}
     */
    public static String calendarData(Date dateTime) {
        //保存输入数据：年数、几月、几号。
        String[] date = DateDayToStringEasy(dateTime).split("-");

        GregorianCalendar gc = new GregorianCalendar();

        int year = gc.get(Calendar.YEAR);  //从当前年算起。

        gc.set(year, Integer.parseInt(date[1]) - 1, Integer.parseInt(date[2]));
        return day_of_week[gc.get(Calendar.DAY_OF_WEEK) - 1] + "";
    }

    /**
     * 获取这个月多少天
     *
     * @param date 日期
     * @return int
     */
    public static int getMonthDayByDate(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.roll(Calendar.DAY_OF_MONTH, -1);
        String format = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        // 得今天是2022年12月4号，所以这个月的最大天数是 31
        return Integer.parseInt(format.substring((format.lastIndexOf("-") + 1)));
    }


    /**
     * 今天是否为节假期
     *
     * @param date 日期
     * @return boolean
     */
    public static boolean todayIsHolidays(Date date) {

        SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
        String httpArg = f.format(date);
        String holidays = isHolidays(httpArg);
        // 上班
        if ("0".equals(holidays)) {
            return true;
        }
        // 周末
        if ("1".equals(holidays)) {
            return false;
        }
        // 节假日
        if ("2".equals(holidays)) {
            return false;
        }
        throw new RuntimeException("判断节假日失败!");
    }


    /**
     * //0 上班 1周末 2节假日
     *
     * @param httpArg
     * @return
     */
    public static String isHolidays(String httpArg) {

        String httpUrl = "http://tool.bitefu.net/jiari/";
        BufferedReader reader;
        String result = null;
        StringBuffer sbf = new StringBuffer();
        httpUrl = httpUrl + "?d=" + httpArg;
        try {
            URL url = new URL(httpUrl);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            InputStream is = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String strRead;
            while ((strRead = reader.readLine()) != null) {
                sbf.append(strRead);
                sbf.append("\r\n");
            }
            reader.close();
            result = sbf.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 算Date的时间差
     *
     * @param date1 date1
     * @param date2 date2
     * @return int
     */
    public static int DayNum(Date date1, Date date2) {
        return (int) ((date1.getTime() - date2.getTime()) / (1000 * 3600 * 24));
    }

    public static int DayNumMin(Date date1, Date date2) {
        return (int) ((date1.getTime() - date2.getTime()) / (1000  * 24));
    }


    /**
     * 算出指定时间的前几天
     *
     * @param date 日期
     * @param day  一天
     * @return {@link Date}
     */
    public static Date DayToDay(Date date, int day) {
        return new Date(date.getTime() - (1000 * 3600 * 24) * day);
    }

    /**
     * 2023-02-15 13:46  -> 13-46
     */
    public static String timeToMin(String time) {
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            Date parse = format.parse(time);
            SimpleDateFormat sdf = new SimpleDateFormat("HH-mm");
            return sdf.format(parse);
        } catch (ParseException e) {
            throw new RuntimeException("时间格式转换异常");
        }
    }

    public static Date StringToDateMin(String time){
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            return format.parse(time);
        } catch (Exception e) {
            throw new RuntimeException("时间格式转换异常");
        }
    }



    /**
     * 字符串转Date
     */
    public static Date StringToDate(String time) {
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            return format.parse(time);
        } catch (ParseException e) {
            throw new RuntimeException("时间格式转换异常");
        }
    }

    /**
     * Date转字符串    详细到秒
     */
    public static String DateDayToString(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }

    /**
     * Date转字符串    详细到天
     */
    public static String DateDayToStringEasy(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(date);
    }

    /**
     * 字符串转Date    详细到秒
     */
    public static Date StringToDateDay(String time) {
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return format.parse(time);
        } catch (Exception e) {
            throw new RuntimeException("时间格式转换异常");
        }
    }

    /**
     * 得到ymd周日期
     *
     * @param week 周
     * @return {@link String}
     */
    public static String getYmdWeekDate(int week) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setTime(getDayDateTime());
        cal.add(Calendar.DATE, week * 7);
//    cal.add(java.util.Calendar.MONTH, -1); // 向前一月；如果需要向后一月，用正数即可
        return sdf.format(cal.getTime());
    }


    /**
     * 获取时间，Data类型
     */
    public static Date getDateTime() {
        try {
            //定义一个模板
            String str = "yyyy-MM-dd HH:mm:ss";
            //创建 SimpleDateFormat一个实例化对象
            SimpleDateFormat sd = new SimpleDateFormat(str);
            //解析字符串的文本，生成 Date
            Date d = sd.parse(getFormatTime());
            return new Timestamp(d.getTime());
        } catch (Exception e) {
            throw new RuntimeException("时间格式转换异常");
        }
    }

    /**
     * 获取时间，Data类型
     */
    public static Date getDayDateTime() {
        try {
            //定义一个模板
            String str = "yyyy-MM-dd";
            //创建 SimpleDateFormat一个实例化对象
            SimpleDateFormat sd = new SimpleDateFormat(str);
            //解析字符串的文本，生成 Date
            Date d = sd.parse(getFormatTime());
            return new Timestamp(d.getTime());
        } catch (Exception e) {
            throw new RuntimeException("时间格式转换异常");
        }
    }


    /**
     * 获取当前时间
     * 精确到天数
     *
     * @return {@link String}
     */
    public static String getDayTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        return format.format(new Date());
    }

    public static String getDayOrderTime() {
        String random = UUID.randomUUID().toString();
        String upperCase = random.toUpperCase();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        return format.format(new Date()) + "-" + upperCase;
    }

    /**
     * 获取当前时间
     * 精确到分钟
     *
     * @return {@link String}
     */
    public static String getFormatTimeHM() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        return format.format(new Date());
    }

    /**
     * 获取当前时间
     * 精确到秒
     *
     * @return {@link String}
     */
    public static String getFormatTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return format.format(new Date());
    }

    /**
     * 自定义格式返回当前系统时间日期、时间字符串
     * yyyy-MM-dd HH:mm:ss
     */
    public static String getFormatTime(String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        return format.format(new Date());
    }


    /**
     * 自定义指定时间的格式
     *
     * @param pattern 模式
     * @param date    日期
     * @return {@link String}
     */
    public static String getFormatTime(String pattern, Date date) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        return format.format(date);
    }

}
